home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / grafwk41.exe / EPSNFX80.ASM < prev    next >
Assembly Source File  |  1990-05-06  |  5KB  |  267 lines

  1.         COMMENT %
  2.  
  3.     GRAPHIC WORKSHOP DOT MATRIX PRINTER DRIVER
  4.     COPYRIGHT (C) 1990 ALCHEMY MINDWORKS INC.
  5.     VERSION 1.0
  6.  
  7.         %
  8.  
  9. PAGEWIDE    EQU    612        ;PAGE WIDTH IN PIXELS
  10. PAGEDEEP    EQU    756        ;PAGE DEPTH IN PIXELS
  11. LINEDEEP    EQU    8        ;NUMBER OF BITS (PINS) IN A LINE
  12. COLOURS        EQU    1        ;ONLY ONE COLOUR SUPPORTED AS YET
  13.  
  14. VERSION        EQU    1        ;VERSION NUMBER
  15. SUBVERSION    EQU    0        ;SUBVERSION NUMBER
  16.  
  17. _AOFF        EQU    6        ;STACK OFFSET
  18.  
  19. CODE        SEGMENT PARA PUBLIC 'CODE'
  20.         ASSUME    CS:CODE
  21.  
  22.         ORG    0000H        ;ORIGIN FOR LOADABLE DRIVER
  23.  
  24.         DB    'ALCHPRDR'    ;SIGNATURE - DON'T CHANGE THIS
  25.  
  26. ;THE FOLLOWING ARE THE POINTERS TO THE CALLABLE ROUTINES AND THE COMMON
  27. ;DATA. THE SEGMENTS ARE FILLED IN BY GRAPHIC WORKSHOP. DON'T CHANGE ANYTHING.
  28. DISPATCH    PROC    FAR
  29.         DW      INIT_PRINTER    ;FAR POINTER TO PRINTER INITIALIZATION
  30.         DW      ?
  31.         DW    PRINT_LINE    ;FAR POINTER TO LINE PRINT
  32.         DW    ?
  33.         DW    DEINIT_PRINTER    ;FAR POINTER TO PRINTER DEINIT
  34.         DW    ?
  35.         DW    PRINT_TEXT    ;FAR POINTER TO TEXT PRINT
  36.         DW    ?
  37.         DW    0,0        ;NULL ONE
  38.         DW    0,0        ;NULL TWO
  39.         DW    0,0        ;NULL THREE
  40.         DW    0,0        ;NULL FOUR
  41.  
  42. V_PAGEWIDE    DW    PAGEWIDE
  43. V_PAGEDEEP    DW    PAGEDEEP
  44. V_LINEDEEP    DW    LINEDEEP
  45. V_COLOURS    DW    COLOURS
  46.  
  47. ;THESE VERSION NUMBERS REFLECT THE DRIVER TEMPLATE VERSION AND THE
  48. ;VERSION OF THE DRIVER ITSELF. YOU CAN CHANGE THE SUBVERSION VALUE
  49. ;TO REFLECT CHANGES IN YOUR DRIVER. THE VERSION VALUE MUST REMAIN
  50. ;UNCHANGED OR GRAPHIC WORKSHOP MAY REJECT YOUR DRIVER.
  51.         DW    VERSION
  52.         DW    SUBVERSION
  53.  
  54. ;THIS SHOULD BE THE PRINTER NAME AS IT WILL APPEAR IN THE GWS MENU.
  55. ;THE FIRST BYTE MUST BE 01H AND THE NAME MUST BE EXACTLY 19 BYTES LONG
  56. ;PLUS ONE ZERO BYTE AT THE END.
  57.  
  58.         DB      01H,'Epson FX-80        ',0
  59. DISPATCH        ENDP
  60.  
  61. ;THIS PROCEDURE SHOULD INITIALIZE THE PRINTER. IT SHOULD ALSO STORE THE
  62. ;FIRST THREE INTS ON THE STACK FOR FUTURE USE. THESE ARE IMAGE_WIDTH,
  63. ;IMAGE_DEPTH AND IMAGE_BYTES RESPECTIVELY. ALSO ON THE STACK ARE A POINTER
  64. ;TO THE GWS CONFIGURATION STRUCT AND A POINTER TO THE CURRENT FILE NAME
  65. INIT_PRINTER    PROC    NEAR
  66.         PUSH    BP
  67.         MOV    BP,SP
  68.  
  69.         MOV    AX,[BP + _AOFF + 0]
  70.         MOV    CS:[IMAGE_WIDTH],AX
  71.  
  72.         MOV    AX,[BP + _AOFF + 2]
  73.         MOV    CS:[IMAGE_DEPTH],AX
  74.  
  75.         MOV    AX,[BP + _AOFF + 4]
  76.         MOV    CS:[IMAGE_BYTES],AX
  77.  
  78.         MOV    DX,OFFSET INIT_SEQ
  79.         CALL    PRINT_STRING
  80.  
  81.         POP    BP
  82.         RETF
  83. INIT_PRINTER    ENDP
  84.  
  85. ;THIS PROCEDURE SHOULD PRINT ONE LINE. A POINTER TO THE LINE IS
  86. ;ON THE STACK.
  87. PRINT_LINE    PROC    NEAR
  88.         PUSH    BP
  89.         MOV    BP,SP
  90.         PUSH    DS
  91.  
  92.         MOV    CX,CS:[IMAGE_WIDTH]
  93.         CMP    CX,0
  94.         JE    PRINT_L3
  95.         CMP    CX,CS:[V_PAGEWIDE]
  96.         JL    PRINT_L1
  97.         MOV    CX,CS:[V_PAGEWIDE]
  98.  
  99. PRINT_L1:    MOV    CS:[START_LO],CL
  100.         MOV    CS:[START_HI],CH
  101.         MOV    DX,OFFSET START_SEQ
  102.         CALL    PRINT_STRING
  103.  
  104.         MOV    SI,[BP + _AOFF + 0]
  105.         MOV    DS,[BP + _AOFF + 2]
  106.  
  107.         MOV    DX,0
  108. PRINT_L2:    PUSH    CX
  109.         CALL    GET_BYTE
  110.         CALL    PRINT_BYTE
  111.         INC    DX
  112.         POP    CX
  113.         LOOP    PRINT_L2
  114.  
  115.         MOV    DX,OFFSET END_SEQ
  116.         CALL    PRINT_STRING
  117.  
  118. PRINT_L3:    POP    DS
  119.         POP    BP
  120.         RETF
  121. PRINT_LINE    ENDP
  122.  
  123. ;THIS SHOULD DO ANYTHING NECESSARY TO FINISH THE PICTURE. IT SHOULD NOT
  124. ;ISSUE A FORM FEED, THOUGH.
  125. DEINIT_PRINTER    PROC    NEAR
  126.         PUSH    BP
  127.         MOV    BP,SP
  128.         PUSH    DS
  129.  
  130.         MOV    DX,OFFSET DEINIT_SEQ
  131.         CALL    PRINT_STRING
  132.         POP    DS
  133.         POP    BP
  134.         RETF
  135. DEINIT_PRINTER    ENDP
  136.  
  137. ;THIS WILL PRINT A LINE OF TEXT TO THE PRINTER. THE STRING IS ON THE
  138. ;STACK FOLLOWED BY THE LENGTH OF THE STRING
  139. PRINT_TEXT    PROC    NEAR
  140.         PUSH    BP
  141.         MOV    BP,SP
  142.         PUSH    DS
  143.  
  144.         MOV    SI,[BP + _AOFF + 0]
  145.         MOV    DS,[BP + _AOFF + 2]
  146.         MOV    CX,[BP + _AOFF + 4]
  147.         CMP    CX,0
  148.         JE    PRINT_T2
  149.  
  150.         CLD
  151. PRINT_T1:    LODSB
  152.         CALL    PRINT_BYTE
  153.         LOOP    PRINT_T1
  154.  
  155. PRINT_T2:    POP    DS
  156.         POP    BP
  157.         RETF
  158. PRINT_TEXT    ENDP
  159.  
  160. ;GET ONE BYTE FROM THE LINE FIELD
  161. GET_BYTE    PROC    NEAR
  162.         PUSH    BX
  163.         PUSH    CX
  164.         PUSH    DX
  165.         PUSH    SI
  166.  
  167.         MOV    BX,DX
  168.         SHR    BX,1
  169.         SHR    BX,1
  170.         SHR    BX,1
  171.  
  172.         MOV    AH,80H
  173.         MOV    CL,DL
  174.         AND    CL,0007H
  175.         SHR    AH,CL
  176.  
  177.         MOV    AL,0
  178.         MOV    CX,CS:[V_LINEDEEP]
  179.  
  180.         MOV    DH,80H
  181. GETBYTE1:    TEST    DS:[SI + BX],AH
  182.         JNZ    GETBYTE2
  183.         OR    AL,DH
  184. GETBYTE2:    ADD     SI,CS:[IMAGE_BYTES]
  185.         SHR    DH,1
  186.         LOOP    GETBYTE1
  187.  
  188.         POP    SI
  189.         POP    DX
  190.         POP    CX
  191.         POP    BX
  192.         RET
  193. GET_BYTE    ENDP
  194.  
  195. ;PRINT A PASCAL STYLE STRING IN CS:DX
  196. PRINT_STRING    PROC    NEAR
  197.         PUSH    CX
  198.         PUSH    BX
  199.         MOV    BX,DX
  200.         MOV    CX,0
  201.         MOV    CL,CS:[BX]
  202. PRINT_S1:    INC    BX
  203.         MOV    AL,CS:[BX]
  204.         CALL    PRINT_BYTE
  205.         LOOP    PRINT_S1
  206.         POP    BX
  207.         POP    CX
  208.         RET
  209. PRINT_STRING    ENDP
  210.  
  211. ;PRINT ONE BYTE IN AL
  212. PRINT_BYTE    PROC    NEAR
  213.         PUSH    AX
  214.         PUSH    BX
  215.         PUSH    CX
  216.         PUSH    DX
  217.         PUSH    SI
  218.         PUSH    DS
  219.         PUSH    AX
  220.  
  221. PRINT_B1:    MOV    AH,2
  222.         MOV    DX,0
  223.         INT    17H
  224.         TEST    AH,80H
  225.         JZ    PRINT_B1
  226.  
  227.         POP    AX
  228.  
  229.         MOV    AH,0
  230.         MOV    DX,0
  231.         INT    17H
  232.  
  233.         POP    DS
  234.         POP    SI
  235.         POP    DX
  236.         POP    CX
  237.         POP    BX
  238.         POP    AX
  239.         RET
  240. PRINT_BYTE    ENDP
  241.  
  242. IMAGE_WIDTH    DW    0
  243. IMAGE_DEPTH    DW    0
  244. IMAGE_BYTES    DW    0
  245.  
  246. ;
  247. ;    NOTE - ALL STRINGS START WITH A LENGTH BYTE
  248. ;
  249.  
  250. ;THIS IS THE STRING SENT TO THE PRINTER AT THE START OF A GRAPHIC LINE
  251. START_SEQ    DB      5,1BH,'*',06H
  252. START_LO    DB    0
  253. START_HI    DB    0
  254.  
  255. ;THIS IS THE STRING SENT TO THE PRINTER AT THE END OF A GRAPHIC LINE
  256. END_SEQ        DB    4,0DH,1BH,'J',18H
  257.  
  258. ;THIS IS THE STRING SENT TO THE PRINTER TO INITIALIZE THE BEAST
  259. INIT_SEQ    DB      2,1BH,'@'
  260.  
  261. ;THIS IS THE STRING SENT TO THE PRINTER TO DIINITIALIZE THE BEAST
  262. DEINIT_SEQ    DB      4,0DH,0AH,1BH,'@'
  263.  
  264. CODE        ENDS
  265.         END
  266.  
  267.